package com.liam.apppush.client.oppo;

import com.alibaba.fastjson.JSONObject;
import com.liam.apppush.config.OPPOConfig;
import com.oppo.push.server.Notification;
import com.oppo.push.server.Result;
import com.oppo.push.server.Sender;
import com.oppo.push.server.Target;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;


/**
 * sdk  不包含标签
 *
 *  可以发送 当个，批量。全量。
 *  标签只能一个一个加
 *
 */
@Slf4j
@Component
public class OPPOSDKClient extends OPPOConfig {


    private Sender sender = null;

    public Sender getSender() throws Exception {
        if (sender == null) {
            synchronized (this) {
                if (sender == null) {
                    sender = new Sender(appKey, masterSecret);
                }
            }
        }
        return sender;
    }


    public void send() throws Exception {
        Notification notification = getNotification(); //创建通知栏消息体
        Target target = Target.build("CN_8fa0618f178145d8c2a44091a1326411"); //创建发送对象
        Result result = getSender().unicastNotification(notification, target);  //发送单推消息

        log.info("send {}", JSONObject.toJSONString(result));

    }

    private Notification getNotification() {
        Notification notification = new Notification();
        notification.setTitle("");
        notification.setContent("");
        /**
         * 以下参数非必填项， 如果需要使用可以参考OPPO push服务端api文档进行设置

         */
//        //通知栏样式 1. 标准样式  2. 长文本样式  3. 大图样式 【非必填，默认1-标准样式】
//        notification.setStyle(1);
//
//        // App开发者自定义消息Id，OPPO推送平台根据此ID做去重处理，对于广播推送相同appMessageId只会保存一次，对于单推相同appMessageId只会推送一次
//        notification.setAppMessageId(UUID.randomUUID().toString());
//
//        // 应用接收消息到达回执的回调URL，字数限制200以内，中英文均以一个计算
//        notification.setCallBackUrl("http://www.test.com");
//
//        // App开发者自定义回执参数，字数限制50以内，中英文均以一个计算
//        notification.setCallBackParameter("");
//
//        // 点击动作类型0，启动应用；1，打开应用内页（activity的intent action）；2，打开网页；4，打开应用内页（activity）；【非必填，默认值为0】;5,Intent scheme URL
//        notification.setClickActionType(4);
//
//        // 应用内页地址【click_action_type为1或4时必填，长度500】
//        notification.setClickActionActivity("com.coloros.push.demo.component.InternalActivity");
//
//        // 网页地址【click_action_type为2必填，长度500】
//        notification.setClickActionUrl("http://www.test.com");
//
//        // 动作参数，打开应用内页或网页时传递给应用或网页【JSON格式，非必填】，字符数不能超过4K，示例：{"key1":"value1","key2":"value2"}
//        notification.setActionParameters("{\"key1\":\"value1\",\"key2\":\"value2\"}");
//
//        // 展示类型 (0, “即时”),(1, “定时”)
//        notification.setShowTimeType(1);
//
//        // 定时展示开始时间（根据time_zone转换成当地时间），时间的毫秒数
//        notification.setShowStartTime(System.currentTimeMillis() + 1000 * 60 * 3);
//
//        // 定时展示结束时间（根据time_zone转换成当地时间），时间的毫秒数
//        notification.setShowEndTime(System.currentTimeMillis() + 1000 * 60 * 5);
//
//        // 是否进离线消息,【非必填，默认为True】
//        notification.setOffLine(true);
//
//        // 离线消息的存活时间(time_to_live) (单位：秒), 【off_line值为true时，必填，最长3天】
//        notification.setOffLineTtl(24 * 3600);
//
//        // 时区，默认值：（GMT+08:00）北京，香港，新加坡
//        notification.setTimeZone("GMT+08:00");
//
//        // 0：不限联网方式, 1：仅wifi推送
//        notification.setNetworkType(0);

        return notification;
    }


    public void sendBatch() throws Exception {
        Map<Target, Notification> batch = new HashMap<Target, Notification>();  // batch最大为1000
        batch.put(Target.build("CN_ddfaa7db1e4ecf75014143bdbc3e53ea"), getNotification());
        batch.put(Target.build("CN_8fa0618f178145d8c2a44091a1326411"), getNotification());

        Result result = sender.unicastBatchNotification(batch); //发送批量单推消息
        result.getStatusCode(); // 获取http请求状态码
        result.getReturnCode(); // 获取平台返回码

        log.info("sendBatch {}", JSONObject.toJSONString(result));

//        List<Result.UnicastBatchResult> batchResult = result.getUnicastBatchResults(); // 批量单推结果
//        for (Result.UnicastBatchResult record : batchResult) {
//            record.getErrorCode();
//            record.getErrorMessage();
//            record.getMessageId();
//            record.getTargetValue();
//        }

    }
}
